﻿using System;
using System.Collections.Generic;
using Sebrae.Academico.InfraEstrutura.Core;
using Sebrae.Academico.InfraEstrutura.Core.UnitOfWork;
using Sebrae.Academico.Trilhas.Dominio.Classes;
using NHibernate.Linq;
using System.Linq;

namespace Sebrae.Academico.Trilhas.BM.Classes
{
    public class BMTrilhaFormaAprendizagem : BusinessManagerBase
    {

        #region Atributos

        private RepositorioBase<TrilhaFormaAprendizagem> trilhaFormaAprendizagem;

        #endregion

        #region "Construtor"

        public BMTrilhaFormaAprendizagem(IUnitOfWork unitOfWork)
        {
            trilhaFormaAprendizagem = new RepositorioBase<TrilhaFormaAprendizagem>(unitOfWork);
        }

        public void IncluirTrilhaFormaAprendizagem(TrilhaFormaAprendizagem pTrilhaFormaAprendizagem)
        {
            trilhaFormaAprendizagem.Salvar(pTrilhaFormaAprendizagem);
        }

        public void AlterarTrilhaFormaAprendizagem(TrilhaFormaAprendizagem pTrilhaFormaAprendizagem)
        {
            trilhaFormaAprendizagem.Salvar(pTrilhaFormaAprendizagem);
        }

        public IList<TrilhaFormaAprendizagem> ObterTodosTrilhaFormaAprendizagem()
        {
            return trilhaFormaAprendizagem.ObterTodos();
        }

        public TrilhaFormaAprendizagem ObterTrilhaFormaAprendizagemPorID(int pId)
        {
            return trilhaFormaAprendizagem.ObterPorID(pId);
        }

        public void ExcluirTrilhaFormaAprendizagem(TrilhaFormaAprendizagem pTrilhaFormaAprendizagem)
        {
            if (this.ValidarDependencias(pTrilhaFormaAprendizagem))
                throw new Exception("Exclusão de registro negada. Existem Registros Dependentes desta Forma de Aprendizagem.");
            
            trilhaFormaAprendizagem.Excluir(pTrilhaFormaAprendizagem);

        }

        protected override bool ValidarDependencias(object pParametro)
        {
            return base.ValidarDependencias(pParametro);
        }

        public bool ValidarDependencias(TrilhaFormaAprendizagem pTrilhaFormaAprendizagem)
        {
            ValidarInstancia(pTrilhaFormaAprendizagem);
            TrilhaFormaAprendizagem trilhaFormaAprendizagem = (TrilhaFormaAprendizagem)pTrilhaFormaAprendizagem;
            return (trilhaFormaAprendizagem.ListaItemTrilha != null && trilhaFormaAprendizagem.ListaItemTrilha.Count > 0);
        }

        public IList<TrilhaFormaAprendizagem> ObterPorFiltro(TrilhaFormaAprendizagem pTrilhaFormaAprendizagem)
        {
            var query = trilhaFormaAprendizagem.Session.Query<TrilhaFormaAprendizagem>();

            if (pTrilhaFormaAprendizagem != null)
            {
                if (!string.IsNullOrWhiteSpace(pTrilhaFormaAprendizagem.Nome))
                    query = query.Where(x => x.Nome.Contains(pTrilhaFormaAprendizagem.Nome));
            }

            return query.ToList<TrilhaFormaAprendizagem>();
        }

        #endregion
        
        public void ValidarTrilhaFormaAprendizagemInformado(TrilhaFormaAprendizagem pTrilhaFormaAprendizagem)
        {
            ValidarInstancia(pTrilhaFormaAprendizagem);

            if (string.IsNullOrWhiteSpace(pTrilhaFormaAprendizagem.Nome)) throw new Exception("Nome. Campo Obrigatório");
        }
    }
}
